Skip to content

Tell users when their organization has moved to Executor v2 - #2269

Merged
RhysSullivan merged 1 commit into
v1-sidebar-v2-import-testsfrom
v1-moved-to-v2-modal
Oct 12, 2026
Merged

RhysSullivan merged 1 commit into
v1-sidebar-v2-import-testsfrom
v1-moved-to-v2-modal

Conversation

@RhysSullivan

@RhysSullivan RhysSullivan commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

When a user finishes importing a v1 organization, Executor v2 writes two keys onto the v1 WorkOS organization's metadata:

  • executor_v2_org_slug: the v2 organization slug
  • executor_v2_moved_at: an ISO 8601 timestamp

v1 now reads them and tells users of a moved organization where it lives. This is only a notice. The organization keeps working in v1.

Endpoint. GET /api/auth/v2-import now returns { url, moved }. moved is { v2Url, v2Slug, movedAt } | null, and v2Url is <v2 origin>/org/<slug>. The origin is the same one the import link uses (the V2_SIGN_UP_URL origin, validated by parseV2Edge). An organization that has moved is not offered the import again, and its eligibility is not read. moved is null in any of these cases:

  • the slug does not match v2's slug rule (^[a-z0-9]+(?:-[a-z0-9]+)*$, at most 45 characters)
  • the timestamp is not a full ISO timestamp with an offset
  • either key is missing
  • the WorkOS read fails
  • v1 has no v2 host configured

Notice. It appears on dashboard load when moved is set. It has:

  • a "Moved Oct 9, 2026" badge
  • the title "<org> now lives in Executor v2"
  • a v1 · <name> → v2 · <slug> pair
  • the line "Changes made here won't sync to v2."
  • "Open <org> in v2" (opens in a new tab) and "Keep using v1"

"Keep using v1" opens a second step: "What went wrong?" with a required free-text field, "Back", and "Send and stay in v1". Send stays disabled until the trimmed text is non-empty.

Snooze. The snooze is stored in localStorage, per browser and per organization:

  • ✕, Escape, or "Open in v2": hidden for 7 days
  • sending feedback: hidden for 30 days

Sidebar. For a moved organization, the "Move to Executor v2" item becomes "Open in Executor v2" and links to the organization in v2. It stays so the user can still reach v2 after snoozing the notice.

Analytics. These events are added to the typed catalog:

  • v2_moved_modal_shown
  • v2_moved_open_clicked { via: "modal" | "sidebar" }
  • v2_moved_stay_clicked
  • v2_moved_feedback_sent { feedback }
  • v2_moved_dismissed { step }

The catalog's rules ban user-entered free text and identity properties. This PR adds one narrow, documented exception: feedback the user writes to us and sends on purpose. The organization is attached through the existing PostHog group, so the events have no org_id property.

Tests are in the PR stacked on top.

Verification

  • bun run format:check, bun run lint, bun run typecheck (45 tasks), and cloud bun run test (867 passed)
  • e2e cloud/v2-moved-notice.test.ts (3 passed) and cloud/v2-import-link.test.ts (4 passed)

Moved notice

Feedback step after Keep using v1

Reads the move v2 records on the WorkOS organization
(executor_v2_org_slug, executor_v2_moved_at) into the v2-import answer,
shows a dismissible notice on the dashboard with a feedback step for
staying on v1, and points the sidebar link at the org in v2.
@RhysSullivan
RhysSullivan added this pull request to stack #2268 October 12, 2026 00:45
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
executor-marketing a9150be Commit Preview URL

Branch Preview URL
Oct 12 2026, 12:47 AM

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
executor-cloud a9150be Oct 12 2026, 12:49 AM

@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Cloudflare preview

Torn down — the PR is closed.

@pkg-pr-new

pkg-pr-new Bot commented Oct 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

@executor-js/cli

npm i https://pkg.pr.new/@executor-js/cli@2269

@executor-js/config

npm i https://pkg.pr.new/@executor-js/config@2269

@executor-js/execution

npm i https://pkg.pr.new/@executor-js/execution@2269

@executor-js/sdk

npm i https://pkg.pr.new/@executor-js/sdk@2269

@executor-js/plugin-file-secrets

npm i https://pkg.pr.new/@executor-js/plugin-file-secrets@2269

@executor-js/plugin-graphql

npm i https://pkg.pr.new/@executor-js/plugin-graphql@2269

@executor-js/plugin-keychain

npm i https://pkg.pr.new/@executor-js/plugin-keychain@2269

@executor-js/plugin-mcp

npm i https://pkg.pr.new/@executor-js/plugin-mcp@2269

@executor-js/plugin-onepassword

npm i https://pkg.pr.new/@executor-js/plugin-onepassword@2269

@executor-js/plugin-openapi

npm i https://pkg.pr.new/@executor-js/plugin-openapi@2269

@executor-js/codemode-core

npm i https://pkg.pr.new/@executor-js/codemode-core@2269

@executor-js/runtime-quickjs

npm i https://pkg.pr.new/@executor-js/runtime-quickjs@2269

executor

npm i https://pkg.pr.new/executor@2269

commit: a9150be

@RhysSullivan
RhysSullivan marked this pull request as ready for review October 12, 2026 02:40
@RhysSullivan
RhysSullivan merged commit 49bd295 into main Oct 12, 2026
43 of 44 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant